﻿#define _CRT_SECURE_NO_WARNINGS 1

//字符分类函数
//为真返回非0整数，为假返回0
//#include <stdio.h>
//#include <ctype.h>
//int main()
//{
//    printf("%d\n", iscntrl('\n'));//任何控制字符
//    printf("%d\n", isspace(' '));//空白字符：空格''，换页'\f'，换行'\n'，回车'\r'，制表符'\t'或者垂直制表符'\v'
//    printf("%d\n", isdigit('8'));//十进制数字，'0'~'9'字符
//    printf("%d\n", isxdigit('c'));//十六进制数字，包括所有十进制数字字符，小写字母a~f，大写字母A~F
//    printf("%d\n", islower('a'));//小写字母a~z
//    printf("%d\n", isupper('D'));//大写字母A~Z
//    printf("%d\n", isalpha('e'));//字母a~z或A~Z
//    printf("%d\n", isalnum('0'));//字母或者数字，a~z,A~Z,0~9
//    printf("%d\n", ispunct('.'));//标点符号，任何不属于数字或者字母的图形字符（可打印）
//    printf("%d\n", isgraph('!'));//任何图形字符(可在屏幕上显示的)
//    printf("%d\n", isprint('$'));//任何可打印字符，包括图形字符和空白字符
//    return 0;
//}


//写一个代码，将字符串中的小写字母转换为大写，其它字符不变。
//#include <stdio.h>
//#include <ctype.h>
//int main()
//{
//	int i = 0;
//	char str[] = { "Test String.\n" };
//	while (str[i])
//	{
//		if (islower(str[i]))
//		{
//			str[i] -= 32;
//		}
//		putchar(str[i]);
//		i++;
//	}
//	return 0;
//}


//字符转换函数
//C语言提供了2个字符转换函数：
//int tolower(int c); //将参数传进去的大写字⺟转小写 
//int toupper(int c); //将参数传进去的小写字⺟转大写
//#include <stdio.h>
//#include <ctype.h>
//int main()
//{
//	int i = 0;
//	char str[] = { "Test String.\n" };
//	while (str[i])
//	{
//		if (islower(str[i]))
//		{
//			str[i] = toupper(str[i]);
//		}
//		putchar(str[i]);
//		i++;
//	}
//	return 0;
//}


//strlen的使用和模拟实现
//size_t strlen(const char * str)
//#include <stdio.h>
//#include <string.h>
//int main()
//{
//	const char* str1 = "abcdef";
//	const char* str2 = "bbb";
//	if (strlen(str2) - strlen(str1) > 0)
//	{
//		printf("str2>str1\n");
//	}
//	else
//	{
//		printf("srt1>str2\n");
//	}
//	return 0;
//}

//模拟实现
//法一：计数器
//#include <stdio.h>
//#include <assert.h>
//size_t my_strlen(const char* str)
//{
//  assert(str);
//	int len = 0;
//	while (*str++ != '\0')
//	{
//		len++;
//	}
//	return len;
//}
//法二：递归
//size_t my_strlen(const char* str)
//{
//	assert(str);
//	if (*str=='\0')
//	{
//		return 0;
//	}
//	return 1 + my_strlen(str + 1);
//}
//法三：指针-指针
//size_t my_strlen(const char* str)
//{
//	assert(str);
//	const char* p = str;
//	while (*str)
//	{
//		str++;
//	}
//	return str - p;
//}
//int main()
//{
//	int len = my_strlen("ABC 1234");
//	printf("%d\n", len);
//	return 0;
//}


//strcpy的使用和模拟实现
//char* strcpy(char* destination, const char* source)
//#include <stdio.h>
//#include <string.h>
//#include <assert.h>
//char* my_strcpy(char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	char* ret = str1;
//	while (*str1++ = *str2++)
//	{
//		;
//	}
//	return ret;
//}
//int main()
//{
//	char str1[20] = { "a" };
//	char str2[] = { "ABCD1234" };
//	//strcpy(str1, str2);
//	my_strcpy(str1, str2);
//	printf("%s\n", str1);
//	return 0;
//}


//strcat的使用和模拟实现
//char* strcat(char* destination, const char* source)
//#include <stdio.h>
//#include <string.h>
//#include <assert.h>
//char* my_strcat(char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	char* ret = str1;
//	while (*str1)
//	{
//		str1++;
//	}
//	while (*str1++ = *str2++)
//	{
//		;
//	}
//	return ret;
//}
//int main()
//{
//	char str1[10] = { "ABCD" };
//	char str2[] = { "1234" };
//	my_strcat(str1,str2);
//	printf("%s\n", str1);
//	return 0;
//}


//strcmp的使用和模拟实现
//int strcmp(const char* str1, const char* str2)
//#include <stdio.h>
//#include <string.h>
//#include <assert.h>
//int my_strcmp(const char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	while (*str1 == *str2)
//	{
//		if (*str1 == '\0')
//		{
//			return 0;
//		}
//		str1++;
//		str2++;
//	}
//	return *str1 - *str2;
//}
//int main()
//{
//	char str1[10] = { "ABCDEFG" };
//	char str2[10] = { "ABCDE" };
//	int result = my_strcmp(str1, str2);
//	printf("%d\n", result);
//	return 0;
//}


//strncpy函数的使用和模拟实现
//char * strncpy ( char * destination, const char * source, size_t num )
//#include <stdio.h>
//#include <string.h>
//#include <assert.h>
//char* my_strncpy(char* str1, const char* str2, int num)
//{
//	assert(str1 && str2);
//	char* ret = str1;
//	while (num--)
//	{
//		*str1++ = *str2++;
//	}
//	return ret;
//}
//int main()
//{
//	char str1[20] = { "XXXXXXXXXXXXX" };
//	char str2[10] = { "ABCDE" };
//	my_strncpy(str1, str2, 2);
//	printf("%s\n", str1);
//	return 0;
//}


//strncat函数的使用和模拟实现
//char* strncat(char* destination, const char* source, size_t num)
//#include <stdio.h>
//#include <string.h>
//#include <assert.h>
//char* my_strncat(char* str1, const char* str2, size_t num)
//{
//	assert(str1 && str2);
//	char* ret = str1;
//	num = num > strlen(str2) ? strlen(str2) : num;
//	while (*str1)
//	{
//		str1++;
//	}
//	while (num--)
//	{
//		*str1++ = *str2++;
//	}
//	*str1 = '\0';
//	return ret;
//}
//int main()
//{
//	char str1[20] = { "XXXXX" };
//	char str2[10] = { "ABCDE" };
//	my_strncat(str1, str2, 6);
//	printf("%s\n", str1);
//	return 0;
//}


//strncmp函数的使用
//int strncmp(const char* str1, const char* str2, size_t num)
//#include <stdio.h>
//#include <string.h>
//#include <assert.h>
//int my_strncmp(const char* str1, const char* str2, size_t num)
//{
//	assert(str1 && str2);
//	while (num--)
//	{
//		if (*str1 == *str2)
//		{
//			str1++;
//			str2++;
//			continue;
//		}
//		return *str1 - *str2;
//	}
//	return 0;
//}
//int main()
//{
//	char str1[20] = { "ABc" };
//	char str2[10] = { "ABCD" };
//	int result = my_strncmp(str1, str2, 4);
//	printf("%d\n", result);
//	return 0;
//}


//strstr的使用和模拟实现
//char* strstr(const char* str1, const char* str2);
//#include <stdio.h>
//#include <string.h>
//#include <assert.h>
//const char* my_strstr(const char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	const char* ret = str1;
//	const char* s2 = str2;
//	const char* cur = str1;	//cur指针记录可能的开始匹配的位置
//
//	while (*cur)
//	{
//		str1 = cur;
//		str2 = s2;
//		while (*str1 && *str1 == *str2)
//		{
//			str1++;
//			str2++;
//		}
//		if (*str2 == '\0')
//		{
//			return cur;
//		}
//		cur++;
//	}
//	return NULL;
//}
//int main()
//{
//	char str1[20] = { "ABBBCDE" };
//	char str2[] = { "BBC" };
//	const char* result = my_strstr(str1, str2);
//	printf("%s\n", result);
//	return 0;
//}


//strtok 函数的使用
// char * strtok ( char * str, const char * delimiters )
//#include <stdio.h>
//#include <string.h>
//int main()
//{
//	char str1[] = { "pzh@qq.com" };
//	char str2[20] = { 0 };
//	char sep[] = { "@." };
//	strcpy(str2, str1);
//
//	for (char* p = strtok(str2, sep); p != NULL; p = strtok(NULL, sep))
//	{
//		printf("%s\n", p);
//	}
//
//	return 0;
//}


//strerror 函数的使用
//char* strerror(int errnum)
//#include <stdio.h>
//#include <string.h>
//#include <errno.h>
//int main()
//{
//	//for (int i = 0; i < 10; i++)
//	//{
//	//	printf("%d:%s\n", i, strerror(i));
//	//}
//	FILE* pf = fopen("test1.c","r");
//	if (NULL == pf)
//	{
//		printf("文件打开失败，原因是:%s\n", strerror(errno));
//		perror("文件打开失败，原因是");
//	}
//	return 0;
//}